
// Vue构造函数
function Vue(options){
  this._init(options);
}

// 初始化方法
Vue.prototype._init = function(options){
  this.$options = options;
  // 1.对`vm.$parent、vm.$root、vm._watcher`等变量进行赋值和初始化的操作
  initLifecycle(this)
  // 2.初始化vm._events，通过updateComponentListeners将vm和_parentListeners执行监听方法
  initEvents(this)
  // 3.通过createElement生成虚拟dom，并且对`vm.$attrs`和`vm.$listeners`设置成响应式的数据
  initRender(this)
  // 4.执行beforeCreate生命周期钩子函数
  callHook(this, 'beforeCreate', undefined, false)
  // 5.对inject接收到的数据做成数据响应式
  initInjections(this)
  // 6.对props、methods、data、computed、watch等数据进行初始化。
  initState(this)
  // 7.对传入的provide参数到的数据做成数据响应式
  initProvide(this)
  // 8.执行created生命周期钩子函数
  callHook(this, 'created')
}

function initLifecycle(vm) {
  console.log('执行initLifecycle方法');
}

function initEvents(vm) {
  console.log('执行initEvents方法');
}

function initRender(vm) {
  console.log('执行initRender方法');
}

function callHook(vm, hook, ...opts) {
  // 源码中是一个生命周期数组，这里简单的看成对象的方式
  const hooks = vm.$options[hook];
  if (hooks) {
    hooks.call(vm);
  }
}

function initInjections(vm) {
  console.log('执行initInjections方法');
}

function initState(vm) {
  console.log('执行initState方法');
}

function initProvide(vm) {
  console.log('执行initProvide方法');
}
